package rohyunji.swing.outline;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;


/*스윙 Swing개요
desktop ui를 개발할때 사용하는 2가지 기술
AWT(abstract window toolkit),Swing
AWT:Java 1.0부터 존재,현재 Swing으로 대체중 
Swing: AWT의 제약을 극복하기 위해 발표,Java1.2부터 도입됨 대표적인 기능은 lookandfeel임
그럼에도 불구하고,Java 2D,Java 3D를 이용해서 풍부한 그래픽 환경을 제공하려면 AWT가 필요하다

AWT vs Swing
이둘간의 차이점은 컴퍼넌트를 그리는 방법에 있음 AWT는 운영체제의 라이브러리를 이용 
따라서 AWT로 작성되는 프로그램은 윈도우와 리눅스에서 다르게보임 
하지만,Swing은 운영체제에 종속되지 않은 독립된 라이브러리를 이용 .
따라서 Swing을 이용한 프로그램은 윈도우나 리눅스에 똑같이 보임 

효과적인 UI개발자가 되려면?
UI컴퍼넌트 :JFrame,JDialog,Jpanel등의 최상위 컨테이너와 여기에 추가할수 있는 각종 컴퍼넌트 
배치관리자 layout mananger:컨테이너에 컴퍼넌트 배치하는 방법 
이벤트 처리: 버튼클릭,마우스 이동,크기조절등의 이벤트에 반응하는 코드 작성


기본 스윙 컴퍼넌트 
스윙은 AWT를 대체하면 ,GUI기반 프로그램 작성을 위한 자바 기술임 하지만 여전히 AWT 관련 기술을 사용하고 있음
스윙 컴퍼넌트는 javax.swing 패키지에 포함됨

java.awt.Container:Jcomponent,java.awt.window
Jcomponent: AbstractButton,JComboBox,jLabel,JMenubar,Jpanel
AbstractButton :JButton,JMenuItem
java.awt.Frame:JFrame
java.awt>Dialog:JDialog
JMenuItem:Jmenu

위에서 보듯 AWT와 스윙의 명백한 차이점은 스윙 컴포넌트의 ㄹ이름에는 J라는 접두사가 있음

2개의 최상위 컨테이너(JFrame,JDialog)를 제외하고 모든 스윙컴퍼넌트는 반드시 컨테이너에 포함되어야한다
일반적으로 모든 스윙 프로그램의 주 컨테이너는 JFrame임(중요)

JFrame
스윙의 최상위 컨테이너 중 하나.
다른 컴퍼넌드들을 여기에 배치하려면 add메서드를 호출 
JFrame은 단 하나의 자식요소인 JRootPane을 가지고있음
따라서, 컴퍼넌트를 추가하는 코드는 frame명.getContentPane(),add(컴퍼넌트)임
또한,JFrame 객체를 화면에 나타내기 위해 

pack(),setVisible()메서드를 사용함 
pack():자식컴퍼넌트에 따라 JFrame 크기 조절
setVisible():JFrame 표시 여부 지정
JFrame을 화면에서 지우려면 dispose()메서드 호출 

한편 ,JFrame의 window영역에는 title bar와 content pane등의 2개의 영역으로 구분 
content pane은 JFrame에 의해 생성되는 또 다른 객체임
일반적으로 JPanel을 content pane으로 사용함 
*/


public class J01_HelloSwingFrame extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
//		JDK6+에서 스윙프로그램은 invokeLater메서드를 이용해서 JFrame을 호출하도록 작성하는것을 추천
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					J01_HelloSwingFrame frame = new J01_HelloSwingFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public J01_HelloSwingFrame() {
		
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//닫기 버튼을 눌렀을때 처리할 내용
		//Exit_ON_CLOSE :system.exit() 호출후 프로그램종료
		//위 기능 외의 것을 처리하려면 DO_NOTHING_ON_CLOSE를 이용해야함 
		setBounds(150, 150, 800, 600);
		//pack()메서드의 대체제 
		//JFrame의 크기를 변경할때 자주 사용
		
//		주의주의주의주의주의주의주의주의주의주의주의주의주의주의
//		주의 : setVisible이 호출되기 전에 먼저 사용 
//		주의주의주의주의주의주의주의주의주의주의주의주의주의주의
//		setBounds(x위치,y위치,너비,높이)
//		setSize(너비,높이)
		
		
		setResizable(false);
		setTitle("Hello,Swing JFrame!!"); //JFrame 제목지정
		
//		JFrame에 컴퍼넌트를 배치하기 위해 JPanel을 하나생성
//		content pane에  JPanel 지정
		
		
		
		contentPane = new JPanel();//패널생성
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
//		JPanel의 상하좌우 여백(padding)지정 방향은 상우하좌(시계방향)
		
		contentPane.setLayout(new BorderLayout(0, 0));
//		component 배치 방법을 지정
//		BorderLayout:5개의 영역으로 구분해 배치 : 영영위치:동서남북,중앙
		setContentPane(contentPane);
//		위에서 생성한 panel을 JFrame의 content pane영영으로 지정
		
	}

}
